package com.mrdeer.merchant.api;

import com.mrdeer.common.domain.BusinessException;
import com.mrdeer.common.domain.PageVo;
import com.mrdeer.merchant.api.dto.MerchantDTO;
import com.mrdeer.merchant.api.dto.MerchantQueryDTO;
import com.mrdeer.merchant.api.dto.StaffDTO;
import com.mrdeer.merchant.api.dto.StoreDTO;

import java.util.List;

/**
 * 商户管理接口
 *
 * @author ：xie jianchu
 * @date ：Created in 2020/9/9 0009 16:48
 */
public interface MerchantService {
    /**
     * 根据ID查询商户
     *
     * @param id 商户ID
     * @return
     * @throws BusinessException
     */
    MerchantDTO queryMerchantById(Long id) throws BusinessException;

    /**
     * 根据租户ID查询商户信息
     *
     * @param tenantId
     * @return
     */
    MerchantDTO queryMerchantByTenantId(Long tenantId);

    /**
     * 注册商户，为了可扩展性使用merchantDto接收和返回数据
     *
     * @param merchantDTO
     * @return
     * @throws BusinessException
     */
    MerchantDTO createMerchant(MerchantDTO merchantDTO) throws BusinessException;

    /**
     * 资质申请
     *
     * @param merchantId  商户ID
     * @param merchantDTO 资质申请信息
     * @throws BusinessException
     */
    void applyMerchant(Long merchantId, MerchantDTO merchantDTO) throws BusinessException;

    /**
     * 新增门店
     *
     * @param storeDTO 门店信息
     * @return 新增成功的门店信息
     * @throws BusinessException
     */
    StoreDTO createStore(StoreDTO storeDTO) throws BusinessException;

    /**
     * 门店列表的查询
     *
     * @param storeDTO 查询条件，必要参数:商户ID
     * @param pageNo   页码
     * @param pageSize 分页记录数
     * @return
     */
    PageVo<StoreDTO> queryStoreByPage(StoreDTO storeDTO, Integer pageNo, Integer pageSize);

    /**
     * 校验门店是否属于商户
     *
     * @param storeId    门店ID
     * @param merchantId 商户ID
     * @return
     */
    Boolean queryStoreInMerchant(Long storeId, Long merchantId);

    /**
     * 商户分页条件查询
     *
     * @param merchantQueryDTO 商户查询信息
     * @param pageNo           页码
     * @param pageSize         分页记录数
     * @return
     * @throws BusinessException
     */
    PageVo<MerchantDTO> queryMerchantPage(MerchantQueryDTO merchantQueryDTO, Integer pageNo, Integer pageSize) throws BusinessException;

    /**
     * 商户资质审核
     *
     * @param merchantId  商户ID
     * @param auditStatus 审核状态
     * @throws BusinessException
     */
    void verifyMerchant(Long merchantId, String auditStatus) throws BusinessException;

    /**
     * 商户下新增门店，并设置管理员
     *
     * @param storeDTO
     * @param staffIds
     * @return
     * @throws BusinessException
     */
    StoreDTO createStore(StoreDTO storeDTO, List<Long> staffIds) throws BusinessException;

    /**
     * 新增员工
     *
     * @param staffDTO 员工信息
     * @return 新增成功的员工信息
     * @throws BusinessException
     */
    StaffDTO createStaff(StaffDTO staffDTO) throws BusinessException;

    /**
     * 将员工和门店绑定
     *
     * @param storeId 门店ID
     * @param staffId 员工ID
     * @throws BusinessException
     */
    void bindStaffToStore(Long storeId, Long staffId) throws BusinessException;

    /**
     * 分页查询商户下的员工
     *
     * @param staffDTO 员工信息
     * @param pageNo   页码
     * @param pageSize 每页数量
     * @return
     * @throws BusinessException
     */
    PageVo<StaffDTO> queryStaffByPage(StaffDTO staffDTO, Integer pageNo, Integer pageSize) throws BusinessException;

    /**
     * 查询某个门店
     *
     * @param id ID
     * @return
     * @throws BusinessException
     */
    StoreDTO queryStoreById(Long id) throws BusinessException;

    /**
     * 修改门店
     *
     * @param store    门店信息
     * @param staffIds 员工ID列表
     * @throws BusinessException
     */
    void modifyStore(StoreDTO store, List<Long> staffIds) throws BusinessException;

    /**
     * 删除某门店
     *
     * @param id
     * @throws BusinessException
     */
    void removeStore(Long id) throws BusinessException;

    /**
     * 商户新增员工和账号
     *
     * @param staffDTO  员工信息
     * @param roleCodes 角色编码列表
     * @throws BusinessException
     */
    void createStaffAndAccount(StaffDTO staffDTO, String[] roleCodes) throws BusinessException;

    /**
     * 查询员工详情
     *
     * @param id       ID
     * @param tenantId 租户ID
     * @return
     */
    StaffDTO queryStaffDetail(Long id, Long tenantId);

    /**
     * 修改员工信息
     *
     * @param staff     员工信息
     * @param roleCodes 角色编码列表
     * @throws BusinessException
     */
    void modifyStaff(StaffDTO staff, String[] roleCodes) throws BusinessException;

    /**
     * 删除员工
     *
     * @param id 员工ID
     * @throws BusinessException
     */
    void removeStaff(Long id) throws BusinessException;
}
